package com.pat.java.base;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;

public class CheckJVMMemery {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * ����һ�������ĺ�����˼��Java��MemoryUsage��ͨ��MemoryUsage���Բ鿴Java �������ڴ�ص��ڴ�ʹ�������
		 *		MemoryUsage�����ĸ�ֵ�������ֽ�Ϊ��λ����		
		 *	Init��java�������������ʱ�������ϵͳ����ĳ�ʼ�ڴ�������
		 *		java����������еĹ���п��������ϵͳ��������ڴ���ڴ��ͷŸ����ϵͳ������init��ֵ�ǲ�ȷ���ġ�		
		 *	Used����ǰ�Ѿ�ʹ�õ��ڴ�����		
		 *	Committed����ʾ��֤java�������ʹ�õ��ڴ��������ύ���ڴ���������ʱ���仯�����ӻ���٣���
		 *		Java �������ܻὫ�ڴ��ͷŸ�ϵͳ��committed ����С�� init��committed ��ʼ�մ��ڻ���� used��
		 *	Max����ʾ���������ڴ���������ڴ��������ֽ�Ϊ��λ�������Բ�������ֵ��������˸�ֵ��
		 *		����ڴ���������ʱ����ġ���ʹ�õ��ڴ��������ύ���ڴ�����ʼ��С�ڻ���� max��������� max����
		 *		����ڴ������ͼ��������������������ʹ���ڴ潫��ʧ�ܣ�used > committed��
		 *		��ʹ used <= max ��ȻΪ true�����磬��ϵͳ�������ڴ治��ʱ����
		 */		
	    MemoryUsage mu = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();  
	    long getCommitted = mu.getCommitted(); 
	    long getInit = mu.getInit();
	    long getUsed = mu.getUsed(); 
	    long max = mu.getMax();  
	      
	    System.out.println(">>getCommitted(byte)>>"+ (float)getCommitted +"<br/>");  	      
	    System.out.println(">>getInit(byte)>>"+ (float)getInit +"<br/>");  	      
	    System.out.println(">>getUsed(byte)>>"+ (float)getUsed +"<br/>");  	      
	    System.out.println(">>max(byte)>>"+ (float)max +"<br/>");  	      
	    System.out.println("===================================<br/>");  	      
	    System.out.println(">>getCommitted(KB)>>"+ (float)getCommitted/1024 +"<br/>");  	      
	    System.out.println(">>getInit(KB)>>"+ (float)getInit/1024 +"<br/>");  	      
	    System.out.println(">>getUsed(KB)>>"+ (float)getUsed/1024 +"<br/>");  	      
	    System.out.println(">>max(KB)>>"+ (float)max/1024 +"<br/>"); 	      
	    System.out.println("===================================<br/>");	      
	    System.out.println(">>getCommitted(MB)>>"+ (float)getCommitted/1024 * 1024 +"<br/>");  	      
	    System.out.println(">>getInit(MB)>>"+ (float)getInit/1024 * 1024 +"<br/>");  	      
	    System.out.println(">>getUsed(MB)>>"+ (float)getUsed/1024 * 1024 +"<br/>"); 	      
	    System.out.println(">>max(MB)>>"+ (float)max/1024 * 1024 +"<br/>"); 
	    /*
	     * 	�鿴����JVM�ڴ���Ϣ
	     *	Runtime.getRuntime().maxMemory();  //�������ڴ棬��Ӧ-Xmx			
	     *	Runtime.getRuntime().freeMemory();  //��ǰJVM�����ڴ�			
	     *	Runtime.getRuntime().totalMemory();  //��ǰJVMռ�õ��ڴ�������ֵ�൱�ڵ�ǰJVM��ʹ�õ��ڴ漰freeMemory()���ܺ�
	     *				
	     *	����maxMemory()��freeMemory()��totalMemory()��			
	     *	maxMemory()ΪJVM���������ڴ棬��ͨ��-Xmx���ã�Ĭ��ֵΪ�����ڴ��1/4����ֵ���ܸ��ڼ���������ڴ棻			
	     *	totalMemory()Ϊ��ǰJVMռ�õ��ڴ�������ֵ�൱�ڵ�ǰJVM��ʹ�õ��ڴ漰freeMemory()���ܺͣ�������JVMʹ���ڴ�����Ӷ����ӣ�			
	     *	freeMemory()Ϊ��ǰJVM�����ڴ棬��ΪJVMֻ������Ҫ�ڴ�ʱ��ռ�������ڴ�ʹ�ã�����freeMemory()��ֵһ������¶���С��
	     *		��JVMʵ�ʿ����ڴ沢������freeMemory()����Ӧ�õ���maxMemory()-totalMemory()+freeMemory()����������JVM�ڴ���䡣
	     */		
		System.out.println("runTime max Mem set:" + ((float)maxMemory() / 1024 * 1024) + " M Bytes.");
		System.out.println("runTime used Mem:" + ((float)usedMemory() / 1024 * 1024) + " M Bytes.");
		System.out.println("runTime free Mem:" + ((float)freeMemory() / 1024 * 1024) + " M Bytes.");
		System.out.println("runTime real free Mem:" + ((float)(maxMemory() - usedMemory() + freeMemory()) / 1024 * 1024) + " M Bytes.");
	}

	public static long usedMemory() {
		long l = Runtime.getRuntime().totalMemory();
		return (l);
	}
	public static long freeMemory() {
		long f = Runtime.getRuntime().freeMemory();
		return (f);
	}	
	public static long maxMemory(){
		return Runtime.getRuntime().maxMemory();
	}
}